/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import static DAO.AbstractDAO.fermeturesSilencieuses;
import static DAO.AbstractDAO.initialisationRequetePreparee;
import Modele.TypeIncident;
import Utils.Constantes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author 20cent
 */
public class TypeIncidentDAOmysql extends AbstractDAO implements TypeIncidentDao {

    private static final String SQL_INSERT = "INSERT INTO `nemo_velo`.`" + ChampsBDD.TABLE_TYPE_INCIDENT + "` (`"
            + ChampsBDD.TYPE_INC_ID + "`, `"
            + ChampsBDD.TYPE_INC_NOM + "`, `"
            + ChampsBDD.TYPE_INC_DESCRIPTION + "`, `"
            + ChampsBDD.TYPE_INC_PROCEDURE + "`, `"
            + ChampsBDD.TYPE_INC_OUTILS
            + "`) VALUES (NULL, ?, ?, ?, ?);";
    private static final String SQL_UPDATE = "UPDATE `nemo_velo`.`" + ChampsBDD.TABLE_TYPE_INCIDENT + "` SET `"
            + ChampsBDD.TYPE_INC_NOM + "` = ? ,`"
            + ChampsBDD.TYPE_INC_DESCRIPTION + "` = ? ,`"
            + ChampsBDD.TYPE_INC_PROCEDURE + "` = ? ,`"
            + ChampsBDD.TYPE_INC_OUTILS + "` = ? "
            + "WHERE `" + ChampsBDD.TYPE_INC_ID + "` = ?;";
    private static final String SQL_DELETE = "DELETE FROM `nemo_velo`.`" + ChampsBDD.TABLE_TYPE_INCIDENT + "` "
            + "WHERE `" + ChampsBDD.TYPE_INC_ID + "` = ?;";
    private static final String SQL_SELECT_PAR_ID = "SELECT * "
            + "FROM  `" + ChampsBDD.TABLE_TYPE_INCIDENT + "` "
            + "WHERE  `" + ChampsBDD.TYPE_INC_ID + "` = ?";
    private static final String SQL_SELECT_ALL = "SELECT * "
            + "FROM  `" + ChampsBDD.TABLE_TYPE_INCIDENT + "` "
            + "LIMIT ?, " + Constantes.LIGNE_PAR_PAGE + ";";

    public TypeIncidentDAOmysql(DAOFactory daoFactory) {
        super(daoFactory);
    }

    @Override
    public void save(TypeIncident typeIncident) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_INSERT, true,
                    typeIncident.getTypeincNom(),
                    typeIncident.getMDescription(),
                    typeIncident.getMProcedure(),
                    typeIncident.getTypeincOutils());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la création du type d'incident, aucune ligne ajoutée dans la table.");
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if (valeursAutoGenerees.next()) {
                /* Puis initialisation de la propriété id du bean Utilisateur avec sa valeur */
                typeIncident.setMId(valeursAutoGenerees.getInt(1));
            } else {
                throw new DAOException("Échec de la création du type d'incident en base, aucun ID auto-généré retourné.");
            }
        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(valeursAutoGenerees, preparedStatement, connexion);
        }
    }

    @Override
    public void update(TypeIncident typeIncident) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_UPDATE, false,
                    typeIncident.getTypeincNom(),
                    typeIncident.getMDescription(),
                    typeIncident.getMProcedure(),
                    typeIncident.getTypeincOutils(),
                    typeIncident.getMId());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la création du type d'incident, aucune ligne ajoutée dans la table.");
            }

        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(preparedStatement, connexion);
        }
    }

    @Override
    public void delete(TypeIncident typeIncident) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_DELETE, false, typeIncident.getMId());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la suppression du type d'incident, aucune ligne supprimée dans la table.");
            }

        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(preparedStatement, connexion);
        }
    }

    @Override
    public TypeIncident getByID(int id) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        TypeIncident typeIncident = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_SELECT_PAR_ID, false, id);
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            if (resultSet.next()) {
                typeIncident = map(resultSet);
            }
        } catch (Exception e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(resultSet, preparedStatement, connexion);
        }
        return typeIncident;
    }

    @Override
    public ArrayList<TypeIncident> getAll(int page) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<TypeIncident> liste = new ArrayList<>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_SELECT_ALL, false, (page - 1) * Constantes.LIGNE_PAR_PAGE);
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            while (resultSet.next()) {
                liste.add(map(resultSet));
            }
        } catch (Exception e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(resultSet, preparedStatement, connexion);
        }
        return liste;
    }

    public static TypeIncident map(ResultSet resultSet) throws SQLException {
        TypeIncident typeIncident = new TypeIncident();

        typeIncident.setMId(resultSet.getInt(ChampsBDD.TYPE_INC_ID));
        typeIncident.setTypeincNom(resultSet.getString(ChampsBDD.TYPE_INC_NOM));
        typeIncident.setMDescription(resultSet.getString(ChampsBDD.TYPE_INC_DESCRIPTION));
        typeIncident.setMProcedure(resultSet.getString(ChampsBDD.TYPE_INC_PROCEDURE));
        typeIncident.setTypeincOutils(resultSet.getString(ChampsBDD.TYPE_INC_OUTILS));

        return typeIncident;
    }
}
